package org.sidora.core.util;

import com.db4o.reflect.jdk.JdkReflector;
import java.lang.reflect.Field;
import java.util.LinkedList;
import java.util.Set;
import java.util.TreeSet;

//import matrix.PersistedData;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import org.sidora.core.Action;
import org.sidora.core.Assignment;
import org.sidora.core.Category;
import org.sidora.core.Describer;
import org.sidora.core.Feature;
import org.sidora.core.KeyObject;
import org.sidora.core.MeasureSet;
import org.sidora.core.Sector;
import org.sidora.core.Site;
import org.sidora.core.User;
import org.sidora.core.Zone;
import org.sidora.core.context.Context;


/**
 * OCProvider
 * @author Enric Tartera, Juan Manuel Gimeno, Roger Masgoret
 * @version 1.0
 */
public final class OCProvider{
    private static String file = "SidoraDB.yap";
    private static ObjectContainer db;// = Db4o.openFile(file);

    private static ClassLoader classloader;
        
    public static ObjectContainer getInstance(){
        if (db==null) OCProvider.openSession();
        return db;
        
    }
    
    private static void openSession(){
        classloader = org.sidora.core.Site.class.getClassLoader();
        Db4o.configure().reflectWith(new JdkReflector(classloader));
        
        Db4o.configure().messageLevel(1);
        //Db4o.configure().activationDepth();
        Db4o.configure().allowVersionUpdates(true);
        Db4o.configure().automaticShutDown(true);
        //Db4o.configure().callbacks(false);
        
        Db4o.configure().objectClass(Context.class).objectField("sectors").indexed(true);
        Db4o.configure().objectClass(Context.class).objectField("feature").indexed(true);        
        Db4o.configure().objectClass(Action.class).objectField("id").indexed(true);
        Db4o.configure().objectClass(Assignment.class).objectField("idAssignment").indexed(true);
        Db4o.configure().objectClass(Feature.class).objectField("sectors").indexed(true);
        Db4o.configure().objectClass(Feature.class).objectField("sectors").cascadeOnActivate(true);
        Db4o.configure().objectClass(Sector.class).objectField("idSector").indexed(true);
        
        Db4o.configure().objectClass(KeyObject.class).objectField("number").indexed(true);
        Db4o.configure().objectClass(KeyObject.class).objectField("site").indexed(true);
        Db4o.configure().objectClass(KeyObject.class).objectField("zone").indexed(true);
        
//        Db4o.configure().objectClass(Site.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(Site.class).cascadeOnActivate(true);
//        
//        
//        Db4o.configure().objectClass(Action.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(Action.class).cascadeOnActivate(true);
//        
//        Db4o.configure().objectClass(Assignment.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(Assignment.class).cascadeOnActivate(true);
//        
//        Db4o.configure().objectClass(Zone.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(Zone.class).cascadeOnActivate(true);
//        
//        Db4o.configure().objectClass(Sector.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(Sector.class).cascadeOnActivate(true);
//        
//        Db4o.configure().objectClass(Feature.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(Feature.class).cascadeOnActivate(true);
//        
//        Db4o.configure().objectClass(KeyObject.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(KeyObject.class).cascadeOnActivate(true);
//        
//        Db4o.configure().objectClass(Category.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(Category.class).cascadeOnActivate(true);
//        
//        Db4o.configure().objectClass(Describer.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(Describer.class).cascadeOnActivate(true);
//        
//        Db4o.configure().objectClass(Context.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(Context.class).cascadeOnActivate(true);
//        
//        //TODO revisar
//        //Db4o.configure().objectClass(VilarsContext.class).cascadeOnUpdate(true);
//        //Db4o.configure().objectClass(VilarsContext.class).cascadeOnActivate(true);
//        
//        Db4o.configure().objectClass(MeasureSet.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(MeasureSet.class).cascadeOnActivate(true);
//
//        
//        //Db4o.configure().objectClass(PersistedData.class).cascadeOnUpdate(true);
//        //Db4o.configure().objectClass(PersistedData.class).cascadeOnActivate(true);
//        
//                /*
//                Db4o.configure().objectClass(RamaPrimaria.class).cascadeOnUpdate(true);
//                Db4o.configure().objectClass(RamaPrimaria.class).cascadeOnActivate(true);
//                 
//                Db4o.configure().objectClass(Ramificacio.class).cascadeOnUpdate(true);
//                Db4o.configure().objectClass(Ramificacio.class).cascadeOnActivate(true);
//                 
//                Db4o.configure().objectClass(Horitzo.class).cascadeOnUpdate(true);
//                Db4o.configure().objectClass(Horitzo.class).cascadeOnActivate(true);
//                 
//                Db4o.configure().objectClass(Igualtat.class).cascadeOnUpdate(true);
//                Db4o.configure().objectClass(Igualtat.class).cascadeOnActivate(true);
//                 */
//        
//        Db4o.configure().objectClass(LinkedList.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(LinkedList.class).cascadeOnActivate(true);
//        
//        Db4o.configure().objectClass(TreeSet.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(TreeSet.class).cascadeOnActivate(true);
//        
//        Db4o.configure().objectClass(Set.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(Set.class).cascadeOnActivate(true);
//      
//        Db4o.configure().objectClass(Class.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(Class.class).cascadeOnActivate(true);
//        
//        Db4o.configure().objectClass(Field.class).cascadeOnUpdate(true);
//        Db4o.configure().objectClass(Field.class).cascadeOnActivate(true);
//        
        db = Db4o.openFile(file);
    }
    
    public static void release(){
        System.out.println("Tancant Sessions");
        while(!db.close()){}
        
    }
    
    
    
}

